﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Com.Binaria.Core;
using Com.Binaria.Core.Enumeracion;
using Com.Binaria.Core.Exceptions;
using Com.Binaria.SISCOB.DTO;
using Com.Binaria.SISCOB.Dom;
using Com.Binaria.SISCOB.Funcional.DTO;

namespace Com.Binaria.SISCOB.Mgr
{

    public class CuentaCorrienteMgr : ICuentaCorrienteMgr
    {
        #region ATRIBUTOS A EXPONER AL USUARIO
        public ICuentaCorrienteDom iCuentaCorrienteDom;
        #endregion

        #region Miembros de ICuentaCorrienteMgr
        public CuentaCorrienteFuncionalDTO GetById(ContextoDTO oContexto, System.Int32? Id)
        {
            CuentaCorrienteFuncionalDTO oItem = null;
            //
            try
            {
                CuentaCorrienteDTO tmp = iCuentaCorrienteDom.BuscarCuentaCorrientePorId(oContexto, Id);
                if (tmp != null)
                {
                    oItem = new CuentaCorrienteFuncionalDTO();
                    oItem.Id = tmp.Id;
                    oItem.NmrCuenta = tmp.NmrCuenta;
                    oItem.Descripcion = tmp.Descripcion;
                    oItem.EstaActivo = Convert.ToBoolean(tmp.EstaActivo);
                }
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return oItem;
        }

        public IList<CuentaCorrienteFuncionalDTO> GetAll(ContextoDTO oContexto)
        {
            IList<CuentaCorrienteFuncionalDTO> oItem = null;
            //
            try
            {
                IList<CuentaCorrienteDTO> tmp = iCuentaCorrienteDom.BuscarCuentaCorrienteTodos(oContexto);
                if (tmp != null)
                {
                    oItem = new List<CuentaCorrienteFuncionalDTO>(tmp.Count);
                    for (int i = 0; i < tmp.Count; i++)
                    {
                        CuentaCorrienteFuncionalDTO oFDto = new CuentaCorrienteFuncionalDTO();
                        oFDto.Id = tmp[i].Id;
                        oFDto.NmrCuenta = tmp[i].NmrCuenta;
                        oFDto.Descripcion = tmp[i].Descripcion;
                        oFDto.EstaActivo = Convert.ToBoolean(tmp[i].EstaActivo);
                        //
                        oItem.Add(oFDto);
                    }
                }
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return oItem;
        }

        public IList<CuentaCorrienteFuncionalDTO> GetBy(ContextoDTO oContexto, CuentaCorrienteFuncionalDTO item)
        {
            IList<CuentaCorrienteFuncionalDTO> oItem = null;
            //
            try
            {
                IList<CuentaCorrienteDTO> tmp = null;
                if (item == null)
                    tmp = iCuentaCorrienteDom.BuscarCuentaCorrienteTodos(oContexto);
                else
                {
                    CuentaCorrienteDTO oDto = new CuentaCorrienteDTO();
                    oDto.Id = item.Id;
                    if (!string.IsNullOrEmpty(item.NmrCuenta)) oDto.NmrCuenta = item.NmrCuenta;
                    //
                    tmp = iCuentaCorrienteDom.BuscarCuentaCorrienteFiltro(oContexto, oDto);
                }

                if (tmp != null)
                {
                    oItem = new List<CuentaCorrienteFuncionalDTO>(tmp.Count);
                    for (int i = 0; i < tmp.Count; i++)
                    {
                        CuentaCorrienteFuncionalDTO oFDto = new CuentaCorrienteFuncionalDTO();
                        oFDto.Id = tmp[i].Id;
                        oFDto.NmrCuenta = tmp[i].NmrCuenta;
                        oFDto.Descripcion = tmp[i].Descripcion;
                        oFDto.EstaActivo = Convert.ToBoolean(tmp[i].EstaActivo);
                        //
                        oItem.Add(oFDto);
                    }
                }
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return oItem;
        }

        public bool Save(ContextoDTO oContexto, CuentaCorrienteFuncionalDTO item)
        {
            bool IsOK = false;
            bool IsExist = (item.Id.HasValue && item.Id > 0);
            List<int> oUpd = null;
            try
            {

                CuentaCorrienteDTO oDto = new CuentaCorrienteDTO();
                oDto.Id = item.Id;
                oDto.NmrCuenta = item.NmrCuenta;
                oDto.Descripcion = item.Descripcion;
                oDto.EstaActivo = item.EstaActivo;

                if (IsExist)
                    iCuentaCorrienteDom.RegistrarCuentaCorriente(oContexto, new List<CuentaCorrienteDTO>() { oDto }, EnumRegistrarAccion.Modificar);
                else
                    iCuentaCorrienteDom.RegistrarCuentaCorriente(oContexto, new List<CuentaCorrienteDTO>() { oDto }, EnumRegistrarAccion.Agregar);

                IsOK = true;
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return IsOK;
        }

        public bool Delete(ContextoDTO oContexto, CuentaCorrienteFuncionalDTO item)
        {
            bool IsOK = false;
            bool IsExist = (item.Id.HasValue && item.Id > 0);

            try
            {
                CuentaCorrienteDTO oDto = new CuentaCorrienteDTO();
                oDto.Id = item.Id;
                
                if (IsExist)
                {
                    iCuentaCorrienteDom.RegistrarCuentaCorriente(oContexto, new List<CuentaCorrienteDTO>() { oDto }, EnumRegistrarAccion.Eliminar);
                }
                IsOK = true;
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return IsOK;
        }
        #endregion
    }
}
